<?php
/**
 * Created by PhpStorm.
 * User: 1
 * Date: 2016-10-17
 * Time: 14:39
 */
namespace app\src\user\action;

use app\src\alibaichuan\service\OpenIMUserService;
use app\src\base\action\BaseAction;
use app\src\user\logic\UserMemberLogic;
use app\src\user\model\UserMember;
use app\src\base\helper\ConfigHelper;
use app\src\base\helper\ValidateHelper;
use app\src\user\logic\MemberConfigLogic;
use app\src\user\logic\MemberLogic;
use app\src\user\logic\UcenterMemberLogic;
use app\src\user\model\UserRelation;
use app\src\user\logic\UserRelationLogic;
use think\Db;
use think\Exception;
use app\src\base\exception\BusinessException;
use app\src\base\helper\ExceptionHelper;


class RelationAction extends BaseAction{

public function error($data){
    exit($data);
    return ['status'=>false,'info'=>$data];
}
    //从普通会员，升级至代理商。建立关系
    /*
     * 该会员已经预存了他的上级
     * 该会员升级级别不明确
     * $upper_uid=>推荐人的uid
     * lower——uid=》被推荐人（普通会员，我）的uid
     * $type=>普通会员要成为的等级
     */
    public function become_agent($recommend_uid,$lower_uid,$type,$same_level_id='')
    {

        //取出推荐人
        $recommend=(new UserMemberLogic())->getInfo(['uid'=>$recommend_uid]);
        if(!$recommend['status']||empty($recommend['info'])) $this->error('查询上级出错，请重试');
        $recommend_type=$recommend['info']['group_id'];

        //升级条件判断
        //判断推荐人是否处于48小时内
        if($recommend['info']['status']==-1) $this->error('上级正处于升级状态，请您联系上级，再进行操作');
        if($recommend_type==4) $this->error('上级权限不足，不能推荐');
        if($recommend_type==1&&$type==1){
            if($recommend['info']['recommend_sum']>=200) $this->error('上级推荐权限已用完，请提醒他升级');
        }elseif($recommend_type==2&&$type==1){
            if($recommend['info']['recommend_sum']>=500) $this->error('上级推荐权限已用完，请提醒他升级');
        }



        $is_repeat=(new UserRelationLogic())->getInfo(['lower_uid'=>$lower_uid]);
        $this->is_ok($is_repeat);

        if(!empty($is_repeat['info'])){
            $this->error('您的关系已经添加，请勿重复');

        }

        //升级条件判断

        if($type>=4||$type<1) $this->error('调用错误');
            //推薦人的身份是稳定的
            //查询上级的关系网.所有推荐人是上级的关系取出来
            $relation=(new UserRelationLogic())->queryNoPaging(['lower_uid'=>$recommend_uid]);
            if(!$relation['status'])$this->error('出现错误');
            $relation=$relation['info'];
            /*
             * 关系到底记录多少，这个上下层关系表
             * 两种操作：新增，修改
             * 新增：
             * 修改：上级的修改不改变上下级关系，所以不存储上下级关系
             */
            $tem=[];
            foreach($relation as $k=>$v){
                if($v['upper_uid']!==$v['lower_uid']){
                    //保证这两个不同
                    unset($v['id']);
                    $v['lower_uid']=$lower_uid;
                    $v['lower_type']=$type;
                    $tem[$k]=$v;
                }
            }

            $tem[]=[
                'upper_uid'=>$recommend_uid,
                'lower_uid'=>$lower_uid,
                'upper_type'=>$recommend_type,
                'lower_type'=>$type
            ];



            //$tem就是需要新增的关系
            //$tem就是需要新增的关系
            $user_relation=(new UserRelation());
            $user_relation->startTrans();
            $add=(new UserRelationLogic())->addAll($tem);
            if($add['status']){
                $user_relation->commit();
                $flag=true;
            }else{
                $user_relation->rollback();
            };
        //我新增，并且级别小于等于推荐人
        if($type<$recommend_type){
            //小于，那么我会产生一个上级，不会产生前级
        }elseif($type==$recommend_type){
            //等于，会缠上一个前级和一个上级
        }elseif($type>$recommend_type){
            //我新增，我的级别大于推荐人

            //推薦人的身份是稳定的
            //查询推荐人的关系网已经没有意义，要查询我推荐人与我同级的上级.把他的关系取出来
//            $my_same_level_id=$recommend['info']['goods_uid'];
//            $my_same_level=(new UserMemberLogic())->getInfo(['uid'=>$my_same_level_id]);
//            if(!$my_same_level['status']||empty($my_same_level['info'])) $this->error('查询出错');
//            if($my_same_level['info']['group_id']==$type){
//            }else{
//                $my_same_level_id=$my_same_level['info']['goods_id'];
//                $my_same_level=(new UserMemberLogic())->getInfo(['uid'=>$my_same_level_id]);
//                if(!$my_same_level['status']||empty($my_same_level['info'])) $this->error('查询出错');
//                if($my_same_level['info']['group_id']==$type){
//                }else{
//                    $this->error('你好像要升级到天上去了');
//                }
//            }
            //查询我目前的上级
        }

        return true;

    }

    //当我升级时，修改因我升级而导致的关系改变
    //首先改变我与我下级的关系。我与我上级的关系需要48小时来确认
    //我升级，导致我与下级的关系瞬间改变
    //-》我升级，如果是下列的情况2，那么没有48小时任务，导致我与上级关系瞬间改变
    //-》我升级，如果是下列的情况1，3，那么有48小时任务，导致我的前级和上级的关系并不明朗-》清空我的前级和我的上级，等48小时候再处理
    /*
     * 我升级的情况分析
     * 我升级-》提醒我前级升级
     * 我升级-》我没有前级—》升级到与我上级同级
     * 我升级-》我没有前级-》升级到我上级的上一级
     */
    //我升級，導致我的同级的上级改变。导致relation和Usermember都改变，先查relation，根据结果修改usermember
    //$my_type为我要升级成的type
    public function update_my_lower($my_uid,$my_type,$my_or_type){
        $relation=(new UserRelationLogic())->queryNoPaging(['upper_id'=>$my_uid]);
        if(!$relation['status']||empty($relation['info'])) $this->error('查询关系信息出错');

        //我的关系中，upper是我的关系，其中有AA关系，也有BA关系，不会出现AB关系
        $relation=$relation['info'];
        $my_lowers=[];
        foreach($relation as $k=>$v){
            //我们是同级关系,我升级了我要变成他的上级,并且改变我们的关系
            //我要变成他的上级，并且把他原来上级的关系删除掉
            //我们原来关系是，我是你的上级，那么我升级后，我还是你的上级，但我的级别改变了
            if($v['upper_type']>=$v['lower_type']){
                $my_lowers_list[]=['id'=>$v['id'],'upper_type'=>$my_type];
            }
            if($v['upper_type']==$v['lower_type']){
                $my_lowers_id[]=$v['lower_uid'];
            }

            if($v['upper_type']<$v['lower_type']){
                //我们原来关系是，我是你的下级，那么我升级后，我们有可能是同级，有可能我是你的上级。这个部分放在update_my_upper里面
                //这个关系是不会再此查出来的
            }
        }

        //循环以后，得到更新表，进行批量更新,将我元同级的上级删除
        $same_map['lower_uid']=['in',$my_lowers_id];
        $same_map['upper_type']=['gt',$my_or_type];
        $delete_same_upper=(new UserRelationLogic())->delete($same_map);

        //循环以后，得到更新表，进行批量更新,将我改成我元同级的上级，将我改为我元下级的上级（级别）
        $relation_mobel=(new UserRelation());
        $relation_mobel->startTrans();
        $add=(new UserRelationLogic())->saveAll($my_lowers_list);
        if(!$add['status']){
            $relation_mobel->rollback();
            $this->error('更新信息出错');
        }
        $flag=true;
        $relation_mobel->commit();

        //循环完以后，得到了我的原本同级，现在下级的下级表。改变了我原有下级关系的，处理下级关系usermember
        if(!empty($my_lowers)){
            $map['uid']=array('in',$my_lowers);
            $query=(new UserMemberLogic())->queryNoPaging($map);
            if(!$query['status']||empty($query['statis'])) $this->error('查询信息出错');
            foreach($query['info'] as $kk=>$vv){
                $tem=$vv;
                if($vv['father_uid']==$my_uid){
                    $tem['father_uid']=null;
                }
                $tem['goods_uid']=$my_uid;
                $my_same_become_lowers[]=$tem;
            }
            $member_mobel=(new UserMember());
            $member_mobel->startTrans();
            $update_member=(new UserMemberLogic())->saveall($my_same_become_lowers);
            if(!$update_member['status']){
                $member_mobel->rollback();
                $this->error('更新信息出错');
            }
            $flag=true;
            $member_mobel->commit();
        }



    }

    //在48小时任务后，或即时，因为我的改变，而导致我与上级的关系改变
    /*
     * 原有同级关系，断掉
     * 原有上级关系，可能变成同级，可能依然是上级
     * 首先，我升级-》我下级关系瞬间改变-》48小时内，我上级升级-》我上级关系瞬间改变
     * status   0我的直接推荐人不需要升级，1我的直接推荐人需要升级并升级至我同级或上级，2我的直接推荐人需要升级但没有升级
     * 0，那么我原来一定没有前级关系，只有一个上级关系
     */
    public function update_my_upper($my_uid,$my_type,$my_upper_type,$status){
        $relation=(new UserRelationLogic())->queryNoPaging(['lower_id'=>$my_uid]);
        if(!$relation['status']||empty($relation['info'])) $this->error('查询关系信息出错');
        //我的关系中，lower是我的关系，其中有AA关系，也有BA关系，不会出现AB关系
        $relation=$relation['info'];

        if($status==0){
            //0，那么我原来一定没有前级关系，只有一个上级关系

            //若我升级到我上级的下级，那么我依然没有前级，我的上级并不变化，但我这个关系中的级别变化
            if($my_upper_type>$my_type){
                foreach($relation as $k=>$v){
                    $list=$v;
                    $list['lower_type']=$my_type;
                    $save=(new UserRelationLogic())->saveByID($v['id'],$list);
                }
            }

            //若我升级到我上级的同级，则产生前级关系，并使上级变化.关系到member
            if($my_upper_type==$my_type){
                if(count($relation)>1) $this->error('数据出错');
                $my_upper_id=$relation['upper_id'];
                //查询我原有上级，在关系中是下级的所有关系
                $upper_relation=(new UserRelationLogic())->queryNoPaging(['lower_id'=>$my_upper_id]);
                if(!$upper_relation['status']||empty($$upper_relation['info'])) $this->error('查询上级出错，请重试');

                $upper_relation=$upper_relation['info'];
                foreach($upper_relation as $k=>$v){
                    if($v['upper_type']>$v['lower_type']){
                        //在上级关系中，上级是下级的时候。上级的上级变为我的上级
                        //member表，把上级和前级的关系修改掉
                        $update_member=(new UserMemberLogic())->save(['uid'=>$my_uid],['father_uid'=>$v['lower_uid'],'goods_uid'=>$v['upper_uid']]);
                        $tem=$v;
                        $tem['lower_uid']=$my_uid;
                        $tem['lower_type']=$my_type;
                        $list[]=$tem;
                    }
                    if($v['upper_type']==$v['lower_type']){
                        //在上级关系中，上级的同级，变为我同级的上级
                        $tem=$v;
                        $tem['lower_uid']=$my_uid;
                        $tem['lower_type']=$my_type;
                        $list[]=$tem;
                    }
                }

                //事务
                $update=(new UserRelationLogic())->saveAll($list);
                if(!$update['status']) $this->error('插入关系出错');
                return true;

            }
        }


        //所有同级发展是我的，所有下级是我的
        foreach($relation as $k=>$v){
            if($v['upper_type']>=$v['lower_type']){
                //当我是关系中的同级或下级时

            }
        }
    }




    //当升级时，修改所属关系
    /*
     * my_uid升级人uid
     * my_type要升级的等级
     */
    public function update($my_uid,$my_type,$my_or_type,$my_or_upper_uid)
    {
        //先查出自己的关系，将之中的关系修改掉

        $my_up_relation=(new UserRelationLogic())->queryNoPaging(['lower_uid'=>$my_uid]);

        $my_low_relation=(new UserRelationLogic())->queryNoPaging(['upper_uid'=>$my_uid,'lower_type'=>$my_or_type]);

        $this->is_ok($my_up_relation);$this->is_empty($my_up_relation);
        $this->is_ok($my_low_relation);

        foreach($my_up_relation['info'] as $k=>$v){
            $tem=$v;

            $tem['lower_type']=$my_type;
            $up_list[]=$tem;
        }


        if(!empty($my_low_relation['info'])){
            foreach($my_low_relation['info'] as $k=>$v){
                $tem=$v;

                $tem['upper_type']=$my_type;
                $low_list[]=$tem;
            }
        }


        if(!empty($up_list)) $up_update=(new UserRelationLogic())->saveAll($up_list);
        if(!empty($low_list)) {$low_update=(new UserRelationLogic())->saveAll($low_list);$this->is_ok($low_update);}
        $this->is_ok($up_update);


        //修改自己在关系表中的等级之后
        //一个人升级的时候，会改变自己的上级，前级，会改变以自己为前级的上级，改变直接推荐人的前级或上级
        /*
         * 1，查询自己新上级--在前置中做掉
         * 2，查询自己新前级--在前置中做掉
         * 3，查询以自己为前级，并且元与自己有相同上级的人，变为他们的上级--本方法只做这一步
         * 4，查询自己的被推荐人，响应改变他们的关系--在前置中做掉
         */
        //查询在同级关系中是我的下级，并且与我有相同上级的人
        $my_or_same_shang=(new UserRelationLogic())->check_or_same($my_uid,$my_or_type,$my_or_upper_uid);

        $this->is_ok($my_or_same_shang);

        if(!empty($my_or_same_shang['info'])){
            foreach($my_or_same_shang['info'] as $k=>$v){
                $tem=[];

                if($v['father_uid']==$my_uid) $tem['father_uid']=null;
                $tem['goods_uid']=$my_uid;
                $update_my_same=(new UserMemberLogic())->save(['uid'=>$v['lower_uid']],$tem);
                if(!$update_my_same['status']) $this->error('插入信息错误');
            }
            //$update_my_same=(new UserMemberLogic())->saveAll($up_my_lower_list);

            $this->is_ok($update_my_same);
        }
        return true;
    }




    public function is_ok($date){
        if(!$date['status']) $this->error('数据查询出错11');
    }

    public function is_empty($date){
        if(empty($date['info'])) $this->error('数据查询为空');
    }

}


